package com.imxiaoyu.wifi.adb.utils;

import com.google.gson.Gson;

import javax.swing.*;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class ConnectUtils {


    /**
     * 链接设备
     * @param name
     * @return
     */
    public static boolean connect(String name) {
        String cmd = SettingsUtils.getSettings().getWifiAdbPath() + "/adb.exe " + "connect " + name;
        List<String> list = CmdUtils.runCmd(cmd);
        String str = new Gson().toJson(list);
        if (str.indexOf("connected to") > -1) {
            //链接成功
            return true;
        }

        JOptionPane.showMessageDialog(null, "目标设备拒接，无法链接。", "链接失败", JOptionPane.ERROR_MESSAGE);
        return false;
    }

    /**
     * 断开设备
     * @param name
     * @return
     */
    public static boolean disconnect(String name) {
        String cmd = SettingsUtils.getSettings().getWifiAdbPath() + "/adb.exe " + "disconnect " + name;
        List<String> list = CmdUtils.runCmd(cmd);
        String str = new Gson().toJson(list);
        if (str.indexOf("disconnected") > -1) {
            //断开成功
            return true;
        }

        JOptionPane.showMessageDialog(null, "设备不存在。", "断开链接失败", JOptionPane.ERROR_MESSAGE);
        return false;
    }

    /**
     * 解析一个usb设备的ip地址，不带端口号
     *
     * @return
     */
    public static String getDeviceIp(String name) {
        String cmd = SettingsUtils.getSettings().getWifiAdbPath() + "/adb.exe" + " -s " + name + " shell ifconfig wlan0 ";
        List<String> list = CmdUtils.runCmd(cmd);
        if (list.size() < 2) {
            return null;
        }
        String str = list.get(1);//ip地址在第二行，实例参数：  inet addr:192.168.22.11  Bcast:192.168.22.255  Mask:255.255.255.0

        Pattern p = Pattern.compile("\\s+");
        Matcher m = p.matcher(str);
        str = m.replaceAll(" ");//将多个连续的空格只保留一个

        str = str.replace(":", " ");
        String[] strList = str.split(" ");
        System.out.print("\n读取到的ip地址：" + strList[3]);
        return strList[3];
    }

    /**
     * 给一个设备设置一个默认端口，默认5555，设置好了之后就可以直接通过ip+端口链接
     *
     * @param name
     * @param port
     * @return
     */
    public static void setDevicePort(String name, String port) {
        String cmd = SettingsUtils.getSettings().getWifiAdbPath() + "/adb.exe" + " -s " + name + " tcpip " + port;
        CmdUtils.runCmd(cmd);
    }

    /**
     * 判定一个设备是否是usb链接
     *
     * @param name
     * @return true-usb链接  false-wifi链接
     */
    public static boolean isUsb(String name) {
        if (name.indexOf(":") == -1) {
            //如果设备的名称带有冒号的，证明是带有端口的，也就不是usb的方式链接的了
            return true;
        }
        return false;
    }


    /**
     * 判定一个usb设备是否已经链接了wifi
     *
     * @param deviceList
     * @param name
     * @return true-usb链接  false-wifi链接
     */
    public static boolean isUsbConnectWifi(List<Map<String, Object>> deviceList, String name) {
        //判定逻辑：先获取这个有线设备的ip地址，如果现有的设备列表已经存在了这个ip地址，证明这个有线设备已经通过wifi链接了
        String ip = getDeviceIp(name);
        for (int i = 0; i < deviceList.size(); i++) {
            String deviceName = deviceList.get(i).get("name") + "";
            if (deviceName.startsWith(ip)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判定一个wifi设备是否已经链接了
     *
     * @param deviceList
     * @param name
     * @return true-usb链接  false-wifi链接
     */
    public static boolean isWifiConnect(List<Map<String, Object>> deviceList, String name) {
        //逻辑：如果这个wifi设备已经在当前的设备列表里，那就是已连接了
        for (int i = 0; i < deviceList.size(); i++) {
            String deviceName = deviceList.get(i).get("name") + "";
            if (deviceName.startsWith(name)) {
                return true;
            }
        }
        return false;
    }
}
